6 #ifndef _CFEXPCONCURENCY_H_ 7 #define _CFEXPCONCURENCY_H_ 11 #define NANO_SEC 1.0E-9 13 #define SERVER_THREAD_BARRIER CFEXPThreadGeneralBarrier 24 #define FEXPCOMMON_IS_WIN_BARR_SUPPORTED (NTDDI_VERSION <= FEXPCOMMON_MY_WIN_VERSION_FOR_COMPILATION) 78 template<
typename TBarrier>
79 static typename std::enable_if<std::is_base_of<ICFEXPSynchrThreadBarrier, TBarrier>::value,
Ptr<TBarrier>>::type
94 template<
typename TBarrier>
95 typename std::enable_if<std::is_base_of<ICFEXPSynchrThreadBarrier, TBarrier>::value,
Ptr<TBarrier>>::type
99 return (thread_count != 0) ?
127 enum BarrierState :
unsigned char { e_INCR, e_DECR };
129 std::condition_variable _cond_var;
131 size_t _thrd_counter;
132 BarrierState _barrier_state;
151 virtual void Dispose ()
override;
158 #if FEXPCOMMON_IS_WIN_BARR_SUPPORTED 159 SYNCHRONIZATION_BARRIER _barrier;
178 virtual void Join () = 0;
179 virtual void Detach () = 0;
180 virtual void Cancel () = 0;
184 template<
typename... VarArgs>
185 std::tuple<VarArgs...>
GetInputDataTuple(VarArgs&&... args) {
return std::tuple<VarArgs...>(args...); }
187 template<
typename TFunc,
typename... VarArgs>
188 void SetInputData(std::function<TFunc> func, std::tuple<VarArgs...> args) { }
202 :
public virtual std::exception
205 virtual char const*
what()
const override {
return "Thread interrupted!!!"; }
214 template<
typename TThread>
217 auto test1 = TThread::_flag_ptr;
220 auto test2 = TThread::_flag_ptr->load();
234 template<
typename TFunc,
typename... VarArgs>
244 virtual void Join ()
override;
245 virtual void Detach ()
override;
246 virtual void Cancel ()
override;
252 void SetInputData(std::function<TFunc> func, std::tuple<VarArgs...> args);
256 std::function<TFunc> _thread_func;
257 std::tuple<VarArgs...> _thread_args;
260 static thread_local std::atomic_bool * _flag_ptr;
261 std::atomic_bool _flag;
263 template<std::size_t... Idx>
264 Ptr<std::thread> create_thread(
const std::tuple<VarArgs...> & tuple, std::index_sequence<Idx...>);
265 template<std::size_t... Idx>
266 void runner(std::function<TFunc> func,
const std::tuple<VarArgs...> & tuple, std::index_sequence<Idx...>);
272 template<
typename TFunc,
typename... VarArgs>
273 thread_local std::atomic_bool *
CFEXPCppThread<TFunc, VarArgs...>::_flag_ptr =
nullptr;
277 template<
typename TFunc,
typename... VarArgs>
286 template<
typename TFunc,
typename... VarArgs>
297 template<
typename TFunc,
typename... VarArgs>
303 _thread = create_thread(_thread_args, std::index_sequence_for<VarArgs...>());
307 template<
typename TFunc,
typename... VarArgs>
311 if (!_thread && !_thread->joinable())
317 template<
typename TFunc,
typename... VarArgs>
321 if (!_thread && !_thread->joinable())
327 template<
typename TFunc,
typename... VarArgs>
335 template<
typename TFunc,
typename... VarArgs>
343 template<
typename TFunc,
typename... VarArgs>
template<std::size_t... Idx>
350 auto lambda_runner = [
this] { runner(_thread_func, _thread_args, std::index_sequence_for<VarArgs...>()); };
355 template<
typename TFunc,
typename... VarArgs>
template<std::size_t... Idx>
360 _thread_func(std::get<Idx>(tuple)...);
382 #endif // !_CFEXPCONCURENCY_H_ std::function< void(void)> t_Procedure
Definition: FEXPConcurency.h:34
virtual char const * what() const override
Definition: FEXPConcurency.h:205
virtual ~CFEXPCppThread()
Definition: FEXPConcurency.h:241
virtual void StartThread()=0
virtual ~ICFEXPConcurrencyBase()
Definition: FEXPConcurency.h:53
CFEXPThreadWin8PLBarrier(std::size_t thread_count)
Definition: FEXPConcurency.cpp:115
const size_t _initial_thrd_count
Definition: FEXPConcurency.h:86
void ThrowIfCancelRequest() noexcept(false)
It throws an exception if cancel of process within the respective thread is required.
Definition: FEXPConcurency.h:215
Base interface for synchronization barrier.
Definition: FEXPConcurency.h:70
virtual void Detach() override
Definition: FEXPConcurency.h:318
Definition: FEXPCommon.h:276
virtual size_t GetNumberOfThreads()
Definition: FEXPConcurency.h:84
virtual ~ICFEXPThreadBase()
Definition: FEXPConcurency.h:174
It represents CPU thread barrier specific to Windows OS ver. 8 and later.
Definition: FEXPConcurency.h:142
Base interface for concurrency.
Definition: FEXPConcurency.h:50
virtual bool Canceling() override
Definition: FEXPConcurency.h:336
virtual void Dispose() override
Definition: FEXPConcurency.h:249
void SetInputData(std::function< TFunc > func, std::tuple< VarArgs... > args)
Definition: FEXPConcurency.h:188
virtual bool Canceling()=0
It represents CPU thread autoreseting barrier. It resets its state after the all entering threads are...
Definition: FEXPConcurency.h:113
virtual ~CFEXPThreadWin8PLBarrier()
Definition: FEXPConcurency.h:147
Base interface for handling with threads.
Definition: FEXPConcurency.h:170
virtual void Dispose() override
Definition: FEXPConcurency.cpp:143
virtual ~CFEXPThreadGeneralBarrier()
Definition: FEXPConcurency.h:118
virtual void SynchronizeThreads() override
Definition: FEXPConcurency.cpp:94
std::tuple< VarArgs... > GetInputDataTuple(VarArgs &&... args)
Definition: FEXPConcurency.h:185
Definition: FEXPConcurency.h:31
virtual void StartThread() override
It starts the thread.
Definition: FEXPConcurency.h:298
static Ptr< TType > SafeAllocInstance(VarArgs &&... inpar)
It allocates data.
Definition: FEXPCommon.h:392
virtual void Join() override
Definition: FEXPConcurency.h:308
virtual ~ICFEXPSynchrThreadBarrier()
Definition: FEXPConcurency.h:75
virtual void Cancel() override
Definition: FEXPConcurency.h:328
virtual void SynchronizeThreads()=0
void SetInputData(std::function< TFunc > func, std::tuple< VarArgs... > args)
Definition: FEXPConcurency.h:287
CFEXPThreadGeneralBarrier(std::size_t thread_count)
Definition: FEXPConcurency.cpp:88
static bool RunProcedureTask(t_Procedure procedure, bool progressbar)
It runs the asynchronous task.
Definition: FEXPConcurency.cpp:12
static std::enable_if< std::is_base_of< ICFEXPSynchrThreadBarrier, TBarrier >::value, Ptr< TBarrier > >::type GetInstance(std::size_t thread_count)
Definition: FEXPConcurency.h:96
friend void ThrowIfCancelRequest()
It throws an exception if cancel of process within the respective thread is required.
Definition: FEXPConcurency.h:215
virtual void Dispose() override
Definition: FEXPConcurency.h:123
ICFEXPSynchrThreadBarrier(size_t thrd_count)
Definition: FEXPConcurency.h:74
Wrapper above C++ std::thread class.
Definition: FEXPConcurency.h:235
Definition: FEXPConcurency.h:201
virtual void SynchronizeThreads() override
Definition: FEXPConcurency.cpp:129
CFEXPCppThread()
Definition: FEXPConcurency.h:239